package com.example.ercmssystem2.repository;

import com.example.ercmssystem2.entity.Event;
import com.example.ercmssystem2.entity.EventType;
import com.example.ercmssystem2.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

@Repository
public interface EventRepository extends JpaRepository<Event, Long> {
    
    List<Event> findByStatus(String status);
    
    List<Event> findByEventType(EventType eventType);
    
    List<Event> findByReporter(User reporter);
    
    List<Event> findByHandler(User handler);
    
    @Query("SELECT e FROM Event e WHERE e.startTime BETWEEN ?1 AND ?2")
    List<Event> findEventsInTimeRange(LocalDateTime start, LocalDateTime end);
    
    List<Event> findByStatusAndPriority(String status, String priority);

    // 根据严重程度查询事件
    List<Event> findBySeverity(String severity);

    // 根据优先级查询事件
    List<Event> findByPriority(String priority);

    // 根据事件类型查询
    List<Event> findByEventTypeId(Long eventTypeId);

    // 根据处理人查询事件
    List<Event> findByHandlerId(Long handlerId);

    // 根据第一响应人查询事件
    List<Event> findByFirstResponderId(Long firstResponderId);

    // 根据上报人查询事件
    List<Event> findByReporterId(Long reporterId);

    // 根据部门查询事件（通过处理人）
    @Query("SELECT e FROM Event e WHERE e.handler.departmentId = :departmentId")
    List<Event> findByDepartmentId(@Param("departmentId") Long departmentId);

    // 查询超时未响应的事件
    @Query("SELECT e FROM Event e WHERE e.status = 'PENDING' AND e.startTime < :timeout")
    List<Event> findTimeoutEvents(@Param("timeout") LocalDateTime timeout);

    // 查询需要升级的事件
    @Query("SELECT e FROM Event e WHERE e.escalationLevel > 0 AND e.status != 'RESOLVED'")
    List<Event> findEscalatedEvents();

    // 根据时间范围查询事件
    List<Event> findByStartTimeBetween(LocalDateTime startTime, LocalDateTime endTime);

    // 查询今日事件
    @Query("SELECT e FROM Event e WHERE DATE(e.startTime) = DATE(:today)")
    List<Event> findTodayEvents(@Param("today") LocalDateTime today);

    // 查询本周事件
    @Query("SELECT e FROM Event e WHERE YEARWEEK(e.startTime) = YEARWEEK(:week)")
    List<Event> findWeekEvents(@Param("week") LocalDateTime week);

    // 查询本月事件
    @Query("SELECT e FROM Event e WHERE YEAR(e.startTime) = YEAR(:month) AND MONTH(e.startTime) = MONTH(:month)")
    List<Event> findMonthEvents(@Param("month") LocalDateTime month);

    // 统计各状态事件数量
    @Query("SELECT e.status, COUNT(e) FROM Event e GROUP BY e.status")
    List<Object[]> countByStatus();

    // 统计各严重程度事件数量
    @Query("SELECT e.severity, COUNT(e) FROM Event e GROUP BY e.severity")
    List<Object[]> countBySeverity();

    // 统计各优先级事件数量
    @Query("SELECT e.priority, COUNT(e) FROM Event e GROUP BY e.priority")
    List<Object[]> countByPriority();

    // 查询平均响应时间
    @Query("SELECT AVG(e.responseTimeMinutes) FROM Event e WHERE e.responseTimeMinutes IS NOT NULL")
    Double getAverageResponseTime();

    // 查询平均解决时间
    @Query("SELECT AVG(TIMESTAMPDIFF(MINUTE, e.startTime, e.resolutionTime)) FROM Event e WHERE e.resolutionTime IS NOT NULL")
    Double getAverageResolutionTime();

    // 根据标签查询事件
    @Query("SELECT e FROM Event e WHERE e.tags LIKE %:tag%")
    List<Event> findByTag(@Param("tag") String tag);

    // 根据来源查询事件
    List<Event> findBySource(String source);

    // 查询处理进度低于阈值的事件
    @Query("SELECT e FROM Event e WHERE e.progressPercentage < :threshold AND e.status != 'RESOLVED'")
    List<Event> findByProgressThreshold(@Param("threshold") Integer threshold);

    // 终端用户操作相关查询方法
    // 根据处理人ID查询事件，按创建时间倒序
    List<Event> findByHandlerIdOrderByCreatedAtDesc(Long handlerId);
    
    // 根据处理人ID和状态查询事件，按创建时间倒序
    List<Event> findByHandlerIdAndStatusInOrderByCreatedAtDesc(Long handlerId, List<String> statuses);
    
    // 查询需要关注的事件（SOS、请求支援）
    @Query("SELECT e FROM Event e WHERE e.safetyStatus = :safetyStatus OR e.supportRequested = :supportRequested")
    List<Event> findBySafetyStatusOrSupportRequested(@Param("safetyStatus") String safetyStatus, 
                                                    @Param("supportRequested") Boolean supportRequested);
    
    // 查询超时未响应的事件
    List<Event> findByStatusAndAssignedTimeBefore(String status, LocalDateTime assignedTime);
    
    // 根据处理人ID和时间范围查询事件历史
    List<Event> findByHandlerIdAndCreatedAtBetweenOrderByCreatedAtDesc(Long handlerId, LocalDateTime start, LocalDateTime end);
    
    // 根据响应状态查询事件
    List<Event> findByResponderStatus(String responderStatus);
    
    // 根据安全状态查询事件
    List<Event> findBySafetyStatus(String safetyStatus);
    
    // 查询有支援请求的事件
    List<Event> findBySupportRequestedTrue();
    
    // 根据支援类型查询事件
    List<Event> findBySupportType(String supportType);
    
    // 查询最近位置更新的事件
    @Query("SELECT e FROM Event e WHERE e.lastLocationUpdate > :since")
    List<Event> findByRecentLocationUpdate(@Param("since") LocalDateTime since);
    
    // 查询特定区域的事件
    @Query("SELECT e FROM Event e WHERE e.currentLatitude BETWEEN :minLat AND :maxLat AND e.currentLongitude BETWEEN :minLng AND :maxLng")
    List<Event> findByLocationRange(@Param("minLat") Double minLat, @Param("maxLat") Double maxLat, 
                                   @Param("minLng") Double minLng, @Param("maxLng") Double maxLng);
    
    // 统计各响应状态的事件数量
    @Query("SELECT e.responderStatus, COUNT(e) FROM Event e GROUP BY e.responderStatus")
    List<Object[]> countByResponderStatus();
    
    // 统计各安全状态的事件数量
    @Query("SELECT e.safetyStatus, COUNT(e) FROM Event e GROUP BY e.safetyStatus")
    List<Object[]> countBySafetyStatus();
    
    // 查询平均响应时间（从分配到到达）
    @Query("SELECT AVG(e.responseTimeMinutes) FROM Event e WHERE e.responseTimeMinutes IS NOT NULL")
    Double getAverageResponseTimeMinutes();
    
    // 查询平均处置时间（从到达到完成）
    @Query("SELECT AVG(e.processingTimeMinutes) FROM Event e WHERE e.processingTimeMinutes IS NOT NULL")
    Double getAverageProcessingTimeMinutes();
    
    // 查询平均总时间（从分配到完成）
    @Query("SELECT AVG(e.totalTimeMinutes) FROM Event e WHERE e.totalTimeMinutes IS NOT NULL")
    Double getAverageTotalTimeMinutes();

    // 根据资源处理人ID查询活动事件
    @Query("SELECT er.event FROM EventResource er WHERE er.handler.id = :handlerId AND er.status IN ('ASSIGNED', 'IN_USE')")
    List<Event> findActiveEventsByResourceHandlerId(@Param("handlerId") Long handlerId);

    // 根据处理人ID和状态查询已完成事件，按完成时间倒序
    List<Event> findByHandlerIdAndStatusInOrderByCompletedTimeDesc(Long handlerId, List<String> statuses);
    
    // 根据处理人ID和状态查询已完成事件，按完成时间倒序
    List<Event> findByHandlerIdAndStatusOrderByCompletedTimeDesc(Long handlerId, String status);
    
    // 根据处理人ID、状态和时间范围查询今日已完成事件，按完成时间倒序
    List<Event> findByHandlerIdAndStatusAndCompletedTimeBetweenOrderByCompletedTimeDesc(Long handlerId, String status, LocalDateTime start, LocalDateTime end);
    
    // 根据处理人ID、状态列表和时间范围查询今日已完成事件，按完成时间倒序
    List<Event> findByHandlerIdAndStatusInAndCompletedTimeBetweenOrderByCompletedTimeDesc(Long handlerId, List<String> statuses, LocalDateTime start, LocalDateTime end);
    
    // 统计处理人处理的事件数量
    long countByHandlerId(Long handlerId);
} 